package com.test34_类加载器.net.util;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.Socket;

/**
 * 自定义网络类加载器
 */
public class NetClassLoader extends ClassLoader {
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 9999;

    /** 自定义类加载的方法 */
    public Class<?> loadData(String className) throws Exception {
        byte[] data = this.loadFileClassData();     // 加载要使用的类文件
        if (data != null) {
            return super.defineClass(className, data, 0, data.length);
        }
        return null;
    }

    /** 加载数据 */
    private byte[] loadFileClassData() throws Exception {
        Socket client = new Socket(SERVER_HOST, SERVER_PORT);   // 进行网络服务器的连接
        InputStream input = client.getInputStream();    // 网络输入流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();    // 内存输出流
        // input.transferTo(bos);
        byte[] temp = new byte[100];
        int len;
        while ((len = input.read(temp)) != -1) {
            bos.write(temp, 0, len);
        }
        byte[] data = bos.toByteArray();
        client.shutdownInput();     // 等待网络数据接收完毕之后，关闭连接
        input.close();
        bos.close();
        return data;
    }
}
